02 - Wprowadzenie do OpenCV
Przetwarzanie i Analiza Obrazów
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 2: Wprowadzenie do OpenCV
Powrót do spisu treści ćwiczeń laboratoryjnych
W tym ćwiczeniu:
Podstawy biblioteki OpenCV w Pythonie.
Wczytywanie, wyświetlanie i zapisywanie obrazów.
Obsługa zdarzeń myszki i klawiatury, suwaki do regulacji parametrów.
1. Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z podstawowym interfejsem OpenCV w Pythonie oraz przygotowanie prostych, interaktywnych narzędzi do pracy z obrazem.
2. Wstęp teoretyczny
Przed przejściem do zadań przeczytaj krótkie informacje poniżej i uruchom wskazany przykład.
2.1. Podstawy OpenCV w Pythonie
OpenCV to biblioteka do przetwarzania obrazów i wideo. W
Pythonie korzystamy z modułu cv2.
Instalacja:
pip install opencv-pythonImport:
import cv2Obraz po wczytaniu to tablica
NumPyo wymiarachwysokość x szerokość x kanałyKolejność kanałów koloru w OpenCV to
BGR(nieRGB)
Dokumentacja: https://docs.opencv.org/5.x/d6/d00/tutorial_py_root.html
2.2. Wczytywanie, wyświetlanie i zapis obrazów
Najważniejsze funkcje:
cv2.imread(path)- odczyt obrazu z plikucv2.imshow(window_name, image)- wyświetlenie obrazu w oknie
Uwaga:
By obraz się wyświetlił, zawsze pocv2.imshow(...)musi nastąpićcv2.waitKey(...), który pozwala na odświeżenie okna i obsługę zdarzeń.
cv2.waitKey(delay)- odczyt klawisza (np.0oznacza czekanie bez limitu)cv2.destroyAllWindows()- zamknięcie wszystkich okien OpenCVcv2.imwrite(path, image)- zapis obrazu do pliku
Dokumentacja: https://docs.opencv.org/5.x/d4/da8/group__imgcodecs.html
2.3. Zdarzenia myszy, klawiatura i suwaki
W OpenCV można budować proste interaktywne aplikacje:
cv2.setMouseCallback(...)- reakcja na kliknięcia i ruch myszycv2.waitKey(...)- obsługa skrótów klawiszowychcv2.createTrackbar(...)icv2.getTrackbarPos(...)- suwaki do sterowania parametrami
Dokumentacja:
- https://docs.opencv.org/5.x/db/d5b/tutorial_py_mouse_handling.html
- https://docs.opencv.org/5.x/da/d6a/tutorial_trackbar.html
2.3.1. Obsługa zdarzeń myszy - przykład
import cv2
import numpy as np
def on_mouse(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print(f'Kliknięto lewym przyciskiem: ({x}, {y})')
elif event == cv2.EVENT_RBUTTONDOWN:
print(f'Kliknięto prawym przyciskiem: ({x}, {y})')
img = np.zeros((300, 512, 3), dtype=np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse)
while True:
cv2.imshow('image', img)
if cv2.waitKey(10) == 27: # ESC
break
cv2.destroyAllWindows()2.3.2. Obsługa klawiatury - przykład
import cv2
import numpy as np
img = np.zeros((300, 512, 3), dtype=np.uint8)
cv2.imshow('image', img)
while True:
key_code = cv2.waitKey(0) # czekaj na klawisz
if key_code == 27: # ESC
print("Zamykam okno")
break
cv2.destroyAllWindows()2.3.3. Suwaki (trackbar) - przykład
import cv2
import numpy as np
def on_change(value):
pass
img = np.zeros((240, 400, 3), dtype=np.uint8)
window_name = 'RGB trackbars'
cv2.namedWindow(window_name)
cv2.createTrackbar('R', window_name, 0, 255, on_change)
cv2.createTrackbar('G', window_name, 0, 255, on_change)
cv2.createTrackbar('B', window_name, 0, 255, on_change)
while True:
r = cv2.getTrackbarPos('R', window_name)
g = cv2.getTrackbarPos('G', window_name)
b = cv2.getTrackbarPos('B', window_name)
img[:] = [b, g, r]
cv2.imshow(window_name, img)
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()UWAGA Trackbar musi być przypięty do istniejącego okna. Dlatego najpierw wywołaj
cv2.namedWindow(...), a dopiero późniejcv2.createTrackbar(...).
3. Zadania do samodzielnego wykonania
Każde zadanie wykonaj w osobnym pliku Python (zad1.py,
zad2.py, …).
💥 Zadanie 1 - Wczytanie i wyświetlenie obrazu 💥
Wczytaj obraz z pliku do zmiennej
img.Sprawdź, czy obraz został poprawnie wczytany (np. za pomocą warunku
img is not None).Sprawdź rozmiar obrazu (
img.shape), typ danych (img.dtype) i wypisz je w konsoli.Wyświetl obraz w oknie
Oryginalkorzystając zcv2.imshow(...).Zamknij okno po naciśnięciu dowolnego klawisza.
💥 Zadanie 2 - Zapis obrazu 💥
Wczytaj obraz jak w Zadaniu 1.
Zapisz kopię pod nazwą
output_copy.jpg.Dodaj komunikat o błędzie, jeśli zapis się nie powiedzie (funkcja
cv2.imwrite(...)zwracaTruelubFalse).
💥 Zadanie 3 - Obsługa klawiatury 💥
- Odczytywanie obrazu z kamery możesz zrealizować za pomocą poniższego kodu:
import cv2
cap = cv2.VideoCapture(0) # 0 to domyślna kamera
while True:
ret, frame = cap.read()
if not ret:
print("Nie można odczytać klatki z kamery")
break
cv2.imshow('Kamera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
# naciśnięcie 'q' kończy pętlę
break
cv2.destroyAllWindows()- Zmodyfikuj powyższy kod tak, aby po naciśnięciu klawisza
szapisywał aktualną klatkę do plikusnapshot.jpg.
💥 Zadanie 4 - Obsługa myszy 💥
Ustaw
cv2.setMouseCallback(...)dla okna z obrazem.Po kliknięciu lewym przyciskiem:
narysuj małe koło w miejscu kliknięcia (wykorzystaj
cv2.circle(...)),wypisz współrzędne kliknięcia w konsoli.
wypisz wartości kanałów
B,G,Rwybranego piksela.
💥 Zadanie 5 - Suwaki do regulacji parametrów 💥
Utwórz okno z suwakami
R,G,B(zakres0-255).Generuj obraz jednolitego koloru na podstawie pozycji suwaków.
Dodaj suwak
ON/OFF:
0- obraz czarny,1- obraz w kolorze z suwaków.